Julia 环境
环境是一个上下文,用于确定 import
或 using
表达式的含义。
- 项目环境(显式环境):是一个 Julia 项目的文件夹,包含了一个 Project.toml 以及可选的 Manifest.toml 文件
- Project.toml 定义了直接依赖和相应的 UUID
- Manifest.toml 定义了依赖树、绝对版本和寻找方法
- 包文件夹环境(隐式环境):是一个包含了一系列 Julia 包的文件的文件夹
- Julia 的环境可以堆栈,一个项目环境和包文件夹的有序集合定义了一个复合的环境。
这三种环境分别具有如下用途:
- 项目环境保证了可重现性
- 包文件夹环境保证了方便性
- 堆栈环境让我们可以方便地管理开发工具
项目环境
每个环境定义了三个映射:roots, graph, paths
- roots:
name::Symbol -> uuid::UUID
- graph:
context::UUID -> name::Symbol -> uuid::UUID
- paths:
uuid::UUID, name::Symbol -> path::String
roots 用于确定顶层的包导入指向的是哪个 UUID,graph 用于确定其他的导入指向的是哪个 UUID。确定之后,
- 如果 Project.toml 即对应 X 和 uuid,那么直接指向
src/X.jl
或 Project.toml 中指定的path
; - 如果 Manifest.toml 含有 X 和 uuid,采用该节中的
path
或计算slug = hash(uuid, git-tree-sha1)
并寻找 Julia DEPOT_PATH 中的packages/X/$slug
包文件夹环境(TODO)
堆栈环境
Julia 的 LOAD_PATH
定义了一个堆栈环境,其默认值为 ["@", "@v#.#", "@stdlib"]
。
@
表示当前活跃环境(Pkg.jl 能操作的环境)@stdlib
表示标准库@name
表示一个命名的环境,其中#
表示用当前的 Julia 版本号替代
在堆栈中,栈顶(列表的第一个元素)总是会被真实地保留下来,但其他的可能产生冲突。